﻿using System;
using System.Windows;
using System.Windows.Controls;
using Controllers;
using Utilities;
using Interfaces;

namespace Views.Moduler
{
    /// <summary>
    /// Interaction logic for Software.xaml
    /// </summary>
    public partial class Software : UserControl
    {
        #region Fields

        private readonly Controller _controller;
        private ISoftware _selectedSoftware;

        #endregion

        #region Creation

        public Software(Controller controller)
        {
            _controller = controller;
            InitializeComponent();
        }

        #endregion

        #region Event Handlers

        // opret software
        private void BtnOpretSoftware_OnClick(object sender, RoutedEventArgs e)
        {
            var form = new Form();
            form.BtnSubmit = "Tilføj software";

            form.CreateTextBox("navn", "Software navn:", "");
            form.CreateDateBox("dato", "Oprettelsesdato", DateTime.Now);

            var window = new FormWindow(form);
            if (window.ShowDialog() == true)
            {
                string navn = (string) form.Result["navn"];
                DateTime dato = (DateTime) form.Result["dato"];

                if (navn.IsValidStringAndHasMaxLengthOf(25))
                {
                    bool oprettet = _controller.TilføjSoftware(navn, dato);

                    if (oprettet)
                    {
                        OpdaterSoftwareListView();   
                    }
                }
                else
                {
                    string validationError = "";

                    if (!navn.IsValidString())
                    {
                        validationError += "Du skal udfylde softwarets navn.\n";
                    }
                    else
                    {
                        if (!navn.IsValidStringAndHasMaxLengthOf(25))
                        {
                            validationError += "Softwarets navn må maks være 25 tegn.\n";
                        }
                    }

                    if (!validationError.IsValidString()) return;

                    MessageBox.Show(validationError);
                }
            }
        }

        // rediger et stykke software
        private void BtnRedigerSoftware_OnClick(object sender, RoutedEventArgs e)
        {
            if (_selectedSoftware == null) return;

            var form = new Form();
            form.BtnSubmit = "Opdater software";

            form.CreateTextBox("navn", "Software navn:", _selectedSoftware.Navn);
            form.CreateDateBox("dato", "Oprettelsesdato", _selectedSoftware.Oprettelsesdato);

            var window = new FormWindow(form);
            if (window.ShowDialog() == true)
            {
                string navn = (string)form.Result["navn"];
                DateTime dato = (DateTime)form.Result["dato"];

                if (navn.IsValidString())
                {
                    bool opdateret = _controller.OpdaterSoftware(_selectedSoftware, navn, dato);

                    if (opdateret)
                    {
                        OpdaterSoftwareListView();
                    }
                }
                else
                {
                    string validationError = "";

                    if (!navn.IsValidString())
                    {
                        validationError += "Du skal udfylde softwarets navn. ";
                    }
                    else
                    {
                        if (!navn.IsValidStringAndHasMaxLengthOf(25))
                        {
                            validationError += "Softwarets navn må maks være 25 tegn. ";
                        }
                    }

                    if (!validationError.IsValidString()) return;

                    MessageBox.Show(validationError);
                }
            }
        }

        // fjern et stykke software
        private void BtnSletSoftware_OnClick(object sender, RoutedEventArgs e)
        {
            if (_selectedSoftware == null) return;

            var result =
                MessageBox.Show(
                    "Er du sikker på at du vil fjerne dette software? Alle de tilhørende produktnøgler vil blive permanent slettet fra systemet!",
                    "Pas på!", MessageBoxButton.YesNo, MessageBoxImage.Error);

            if (result == MessageBoxResult.Yes)
            {
                bool slettet = _controller.FjernSoftware(_selectedSoftware);
                if (slettet)
                {
                    OpdaterSoftwareListView();
                }
            }
        }

        // vis SoftwareUdlån vindue
        private void BtnVisSoftware_Click(object sender, RoutedEventArgs e)
        {
            if (_selectedSoftware == null) return;

            var window = new SoftwareUdlån(_selectedSoftware, _controller);
            window.Title = _selectedSoftware.Navn;
            window.ShowDialog();
        }

        private void LwSoftware_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var software = LwSoftware.SelectedItem as ISoftware;
            _selectedSoftware = software;

            bool softwareIsSelected = (software != null);

            BtnSletSoftware.IsEnabled = softwareIsSelected;
            BtnRedigerSoftware.IsEnabled = softwareIsSelected;
            BtnVisSoftware.IsEnabled = softwareIsSelected;
        }

        #endregion

        #region Tilstandsstyring

        public void OpdaterSoftwareListView()
        {
            LwSoftware.ItemsSource = null;
            LwSoftware.ItemsSource = _controller.HentAltSoftware();
        }

        public void OpdaterSide()
        {
            OpdaterSoftwareListView();
        }

        #endregion
    }
}
